// 三者作用都是改变函数this的指向
// 三者第一个传参都是要this要指向的对象
// apply、call是立即执行函数，bind需要再次调用
function example() { }
example.prototype = {
  name: 'will',
  say: function () {
    console.log('hi,' + this.name + '!')
  }
}
var e = new example()
e.say() // hi,will!

var obj = {
  name: 'lucky'
}
e.say.apply(obj) // hi,lucky! 此时this.name是lucky
e.say.call(obj) // hi,lucky! 此时this.name是lucky
e.say.bind(obj)() // hi,lucky! 此时this.name是lucky



// apply call 区别
function func(arg1, arg2) {
  console.log(arg1 + arg2)
}
func.apply(this, [1, 2]) // apply接受的参数，第一个是对象，第二个是array & array-like
func.call(null, 1, 2) // call接受的参数，第一个是对象，后面一个接一个